#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>

using namespace std;

void showPending(sigset_t& pending)
{
    for (int sig = 1; sig <= 64; sig++)
    {
        if (sigismember(&pending, sig))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}

int main()
{
    sigset_t bset, obset;
    sigset_t pending;

    sigemptyset(&bset);
    sigemptyset(&obset);
    sigemptyset(&pending);

    sigaddset(&bset, 2);
    sigaddset(&bset, 40);

    int n = sigprocmask(SIG_BLOCK, &bset, &obset);
    assert(n == 0);
    (void)n;

    cout << "block 2号. 40号 信号成功...., pid: " << getpid() << endl;

    while (true)
    {
        sigpending(&pending);
        showPending(pending);
        sleep(1);
    }
    
    return 0;
}



// void sigcb(int signum)
// {
//     cout << "捕捉信号 : " << signum << endl;
// }

// int main()
// {
//     struct sigaction act, oact;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     act.sa_handler = sigcb;

//     sigaction(2, &act, &oact);

//     //cout << "default action : " << (int)(oact.sa_handler) << endl;

//     while (true) 
//     {
//         cout << "等待捕捉一个信号..." << endl;
//         sleep(1);
//     }

//     return 0;
// }


// void sigcb(int signum)
// {
//     cout << "捕捉信号 : " << signum << endl;
// }

// int main()
// {
//     signal(2, sigcb);

//     while (true)
//     {
//         cout << "等待捕捉一个信号..." << endl;
//         sleep(1);
//     }
//     return 0;
// }